package com.hydra.cron.common.utils;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketAddress;
import java.nio.channels.SocketChannel;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by lee on 15/12/22.
 */
public class SysUtil {
    public static String normalizeAddress(String address){
        String[] blocks = address.split("[:]");
        if(blocks.length > 2){
            throw new IllegalArgumentException(address + " is invalid");
        }
        String host = blocks[0];
        int port = 80;
        if(blocks.length > 1){
            port = Integer.valueOf(blocks[1]);
        } else {
            address += ":"+port; //use default 80
        }
        String serverAddr = String.format("%s:%d", host, port);
        return serverAddr;
    }

    public static String getLocalAddress(String address){
        String[] blocks = address.split("[:]");
        if(blocks.length != 2){
            throw new IllegalArgumentException(address + " is invalid address");
        }
        String host = blocks[0];
        int port = Integer.valueOf(blocks[1]);

        if("0.0.0.0".equals(host)){
            return String.format("%s:%d",SysUtil.getLocalIp(), port);
        }
        return address;
    }

    public static String getLocalIp() {
        try {
            Pattern pattern = Pattern.compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+");
            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
            String condidate = null;
            while (interfaces.hasMoreElements()) {
                NetworkInterface ni = interfaces.nextElement();
                Enumeration<InetAddress> en = ni.getInetAddresses();
                while (en.hasMoreElements()) {
                    InetAddress addr = en.nextElement();
                    String ip = addr.getHostAddress();
                    Matcher matcher = pattern.matcher(ip);
                    if (matcher.matches()) {
                        if(ip.startsWith("127.")) continue;
                        if(ip.startsWith("10.")
                                || ip.startsWith("172.")
                                || ip.startsWith("192.")
                                ){
                            if(condidate == null){
                                condidate = ip;
                            }
                            continue;
                        }
                        return ip;
                    }
                }
            }
            if(condidate != null) return condidate;
            return "127.0.0.1";
        } catch (Throwable e) {
            return "127.0.0.1";
        }
    }
    public static String remoteAddress(SocketChannel channel){
        SocketAddress addr = channel.socket().getRemoteSocketAddress();
        String res = String.format("%s", addr);
        return res;
    }

    public static String localAddress(SocketChannel channel){
        SocketAddress addr = channel.socket().getLocalSocketAddress();
        String res = String.format("%s", addr);
        return addr==null? res: res.substring(1);
    }

    public static void main(String[] args) {
        System.out.println(SysUtil.getLocalIp());
    }
}
